package EDesign23;

public class CSingleton {

    private static CSingleton singletonOne;

    private CSingleton() {
    }

    public static CSingleton getInstance() {
        if (singletonOne == null) {
            singletonOne = new CSingleton();
        }
        return singletonOne;
    }

    //    public class SingletonOne {
//        private static SingletonOne singletonOne;
//
//        private SingletonOne() {
//        }
//
//        public static SingletonOne getInstance() {
//            if (singletonOne == null) {
//                singletonOne = new SingletonOne();
//            }
//            return singletonOne;
//        }
//    }

    // 1.1 线程安全的懒汉单例模式
//    public class SingletonTwo {
//        private static SingletonTwo singletonTwo;
//
//        private SingletonTwo() {
//        }
//
//        public static SingletonTwo getInstance() {
//            if (singletonTwo == null) {
//                synchronized (SingletonTwo.class) {
//                    if (singletonTwo == null) {
//                        singletonTwo = new SingletonTwo();
//                    }
//                }
//            }
//            return singletonTwo;
//        }
//    }

//    public class SingletonTwo {
//        private volatile static SingletonTwo singletonTwo;
//
//        private SingletonTwo() {
//        }
//
//        public static SingletonTwo getInstance() {
//            if (singletonTwo == null) {
//                synchronized (SingletonTwo.class) {
//                    if (singletonTwo == null) {
//                        singletonTwo = new SingletonTwo();
//                    }
//                }
//            }
//            return singletonTwo;
//        }
//    }


    // 1.2  ]饿汉式单例模式
//    public class SingletonThree {
//        private static SingletonThree singletonOne = new SingletonThree();
//
//        private SingletonThree() {
//        }
//
//        public static SingletonThree getInstance() {
//            return singletonOne;
//        }
//    }

    // 1.3 内部静态类方式  // 这种方式利用类加载的机制达到了双重检查模式的效果，而代码更为简洁。 (懒汉式)
//    public class SingletonFour {
//
//        private SingletonFour() {
//        }
//
//        public static SingletonFour getInstance() {
//            return SingletonHolder.singletonFour;
//        }
//
//        private static class SingletonHolder{
//            private static final SingletonFour singletonFour = new SingletonFour();
//
//        }
//    }

    //    2. 单例模式适用场景

}
